package com.hunan.yllxy.util;

import io.jsonwebtoken.*;

import java.util.Date;

public class JwtUtils {

    /**
     * 签名需要的私有密钥
     */
    private static final String SECRET = "yllxy-hunan";

    public static final long TTL = 2 * 60 * 60 * 1000;


    /**
     * 通过用户信息和过期时间生成Jwt
     *
     * @param userName      用户信息
     * @param ttlMillis 过期时间
     * @return token
     */
    public static String createJwt(String userName,String userId,long ttlMillis) {
        // 签名算法 HS256，即jjwt已经封装header中需要的算法名称
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        // 生成Jwt的时间，即签发时间
        long nowMillis = System.currentTimeMillis();
        // 构建Jwt
        JwtBuilder builder = Jwts.builder()
                // jwt的唯一标识
                .setId(userId)
                // jwt面向用户
                .setSubject(userName)
                // jwt的签发者
                .setIssuer("EGIS_CX")
                // jwt的签发时间
                .setIssuedAt(new Date(nowMillis))
                // 设置签名使用的签名算法和签名使用的秘钥
                .signWith(signatureAlgorithm, SECRET);
        // 自定义payload的claim信息
        builder.claim("role", "admin");
        // 设置过期时间，需要大于签发时间
        if (ttlMillis > 0) {
            long expMillis = nowMillis + ttlMillis;
            builder.setExpiration(new Date(expMillis));
        }
        String token = builder.compact();
        return token;
    }

    /**
     * 刷新 token
     *
     * @param token
     * @return
     */
    public static String refreshToken(String token) {
        return generateToken(parseJwt(token));
    }

    /**
     * 生成 token
     *
     * @param claims
     * @return
     */
    private static String generateToken(Claims claims) {
        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + TTL)) // 到期时间
                .signWith(SignatureAlgorithm.HS256, SECRET) // 签名
                .compact();
    }
    /**
     * 解析jwt，解析时若过期会抛出ExpiredJwtException异常
     *
     * @param jwt token
     * @return jwt对象
     */
    public static Claims parseJwt(String jwt) {
        // 解析jwt
        JwtParser parser = Jwts.parser();
        // 获取解析后的对象
        Claims claims = Jwts.parser()
                // 设置签名秘钥，和生成的签名的秘钥一模一样
                .setSigningKey(SECRET)
                // 设置需要解析的jwt
                .parseClaimsJws(jwt).getBody();
        return claims;
    }




}
